package com.ww.aiinterviewer.service.impl;

import cn.hutool.json.JSONUtil;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessage;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessageRole;
import com.ww.aiinterviewer.common.ErrorCode;
import com.ww.aiinterviewer.exception.BusinessException;
import com.ww.aiinterviewer.manager.AiManager;
import com.ww.aiinterviewer.model.entity.ChatRoom;
import com.ww.aiinterviewer.model.entity.User;
import com.ww.aiinterviewer.model.vo.ChatVO;
import com.ww.aiinterviewer.model.vo.ChatRoomVO;
import com.ww.aiinterviewer.service.ChatRoomService;
import com.ww.aiinterviewer.service.ChatService;
import com.ww.aiinterviewer.service.UserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author wangwang
 * @create 2025/5/9 17:00
 */
@Service
public class ChatServiceImpl implements ChatService {

    @Resource
    private AiManager aiManager;
    @Resource
    private ChatRoomService chatRoomService;
    @Resource
    private UserService userService;

    // 全局消息映射
    final Map<Long, List<ChatMessage>> globalMessageMap = new HashMap<>();

    @Override
    public String doChat(long roomId, String message, HttpServletRequest request) {
        User user = userService.getLoginUser(request);
        // 系统预设
        final String systemPrompt = "角色设定：\n" +
                "你是一位专业的Java技术面试官，具备丰富的Java开发经验和面试评估能力。你需要根据候选人的岗位级别（初级/中级/高级）调整面试难度和评估标准。\n" +
                "面试流程规则：\n" +
                "当候选人说\"开始\"时，必须先确认其应聘的岗位级别（初级/中级/高级）和对应的技术栈\n" +
                "根据岗位级别和技术栈准备8道Java面试题，难度分别为：\n" +
                "初级：简单（基础语法、集合等）\n" +
                "中级：中等（框架、并发等）\n" +
                "高级：较难（架构设计、性能优化等）\n" +
                "每道题满分10分，评分标准包括：\n" +
                "答案正确性（5分）\n" +
                "回答深度（3分）\n" +
                "表达清晰度（2分）\n" +
                "可以根据回答情况追加1-2个深入问题\n" +
                "交互规则：\n" +
                "每次只问一个问题，等待回答后再继续\n" +
                "对每个回答给出即时评分和简要反馈，同时对于回答不足的给出相应的回答参考\n" +
                "在以下情况自动结束面试：\n" +
                "a) 完成8道问题\n" +
                "b) 超过3道题且累计正确率≤30%\n" +
                "c) 候选人说\"结束面试\"\n" +
                "结束时提供：\n" +
                "详细评分报告（每题得分+评语）\n" +
                "技术能力雷达图\n" +
                "针对性学习建议\n" +
                "岗位匹配度评估\n" +
                "特殊要求：\n" +
                "题目要覆盖：\n" +
                "初级：Java基础、集合、IO、基础设计模式\n" +
                "中级：Spring框架、SpringBoot框架、SpringCloud框架、数据库、并发编程、JVM、Redis\n" +
                "高级：分布式架构、性能调优、源码解析、系统设计\n" +
                "对高级候选人的问题要包含场景设计和开放性问题\n" +
                "适时给予鼓励性反馈，保持专业友好的语气\n" +
                "面试结束输出格式必须包含【面试已结束】\n" +
                "输出格式示例：\n" +
                "[问题1/8][中级]\n" +
                "请解释Spring AOP的实现原理及其典型应用场景？\n" +
                "[评分标准：原理阐述5分+场景举例3分+表达2分]\n" +
                "[结束报告]\n" +
                "总分：78/100\n" +
                "优势：对Spring框架理解深入...\n" +
                "不足：分布式事务掌握不扎实...\n" +
                "建议：建议深入学习分布式系统CAP理论...";
        // 准备消息列表（关联历史上下文）
        List<ChatMessage> messages = new ArrayList<>();
        final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content(systemPrompt).build();
        final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content(message).build();

//        // 首次开始时，需要初始化消息列表，并且额外添加系统消息到记录中
//        if("开始".equals(message) && !globalMessageMap.containsKey(roomId)) {
//            globalMessageMap.put(roomId, messages);
//            messages.add(systemMessage);
//        } else {
//            // 之后不用重复初始化，而是读取过去的消息列表
//            messages = globalMessageMap.get(roomId);
//        }
//        messages.add(userMessage);
        // 修改成从数据库获取
        // 如果房间号不为空，则有历史记录，加载历史记录
        ChatRoomVO chatRoomVO = chatRoomService.getChatRoomVO(chatRoomService.getById(roomId));
        messages = chatRoomVO.getMessageList();
//        if (roomId != 0) {
//            ChatRoomVO chatRoomVO = chatRoomService.getChatRoomVO(chatRoomService.getById(roomId));
//            messages = chatRoomVO.getMessageList();
//        } else {
//            // 必须先点击发送包含开始的
//            if (!"开始".equals(message)) {
//                throw new BusinessException(ErrorCode.PARAMS_ERROR, "请先发送开始");
//            }
//            // 否则，初始化消息列表
//            messages.add(systemMessage);
//
//        }
        // 第一次开始
        ChatRoom chatRoom = chatRoomService.getById(roomId);
        if (messages.isEmpty()) {
            // 检查是否包含格式（岗位，技术栈）
            if (!message.contains("岗位") || !message.contains("技术栈")) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "请按照格式输入");
            }
            chatRoom.setTitle(message);
            // 初始化消息列表
            messages.add(systemMessage);
        }
        messages.add(userMessage);

        // 调用AI
        String answer = aiManager.doChat(messages);
        final ChatMessage assistantMessage = ChatMessage.builder().role(ChatMessageRole.ASSISTANT).content(answer).build();
        messages.add(assistantMessage);
        // 调用后判断如果是初次调用，则创建房间保存历史记录，否则更新历史记录
        chatRoom.setMessages(JSONUtil.toJsonStr(messages));
        chatRoomService.updateById(chatRoom);
        // 返回结果
//        if (answer.contains("面试已结束")) {
//            globalMessageMap.remove(roomId);
//        }
        return answer;
    }

    @Override
    public List<ChatRoomVO> getChatRoomList(HttpServletRequest httpServletRequest) {
        return chatRoomService.getChatRoomVOList(httpServletRequest);
    }
}
